<?php

require('config.inc');
require('includs.inc');
/*
 * FOR 500 Error
include('500.html');
exit();
 *
 */
ob_start();


# DECLARATION OF VARIABLES
$layout    = 'index.html';
$data      = FALSE;
$action    = !empty($_REQUEST['a'])        ? $FILTER->getFirstInteger($_REQUEST['a'])  : FALSE;
$id        = isset($_REQUEST['id'])        ? $FILTER->getFirstInteger($_REQUEST['id']) : FALSE;
$p         = !empty($_GET['p'])            ? $FILTER->getFirstInteger($_GET['p'])      : 1;
$ajaxmode  = !empty($_REQUEST['ajaxmode']) ? TRUE                                      : FALSE;
$commit    = !empty($_REQUEST['commit'])   ? TRUE                                      : FALSE;
$meta      = array('title'=>'','words'=>'','description'=>'');
$category  = false;
$articles  = false;
$article   = false;
$subdomain = NULL;
unset($_REQUEST['id'], $_REQUEST['c'], $_REQUEST['a'], $_REQUEST['commit']);



// IF SITE IS LOCKED - FILTER VISITORS BY IP
if(config::read('access'))
{
   $access_mask = config::read('access');
   $access_mask = explode(',', $access_mask);
   for($i=0, $t=count($access_mask); $i<$t; $i++)
   {
      $access_mask[$i] = str_replace(array('.','*'), array('\.','[\d]{1,3}'), trim($access_mask[$i]));
   }
   $access_mask = '/^'. implode('|', $access_mask) .'/';
   if(!$REQUEST->isAdminMode() && !preg_match($access_mask, get_ip()))
   {
      include('lock.html');
      exit();
   }
}


$path['library']   = LIBRARY;
$path['tmp']       = TMP_FOLDER;

$categories = $TREE->getFlatTree();
$SMARTY->assign('categories', $categories);

/*----  ASSIGN SYSTEM ENV ----*/
$SMARTY->assign_by_ref('path', $path);
$SMARTY->assign('request', $REQUEST->getRequestPath());
$SMARTY->assign('rlength', $REQUEST->getRequestLength());

paginator::setCurrentPage($REQUEST->getRequestPage());
$SMARTY->assign('page', $REQUEST->getRequestPage());


$handler = false;
if($REQUEST->isAdminMode())
{
   if(session::user() && session::user()->hasRole('ADMIN_ACCESS'))
   {
      # WORK UNDER ADMIN MODE IF HAVE ACCESS PERMITION
      $tmp_request = $REQUEST->getRequestPath();
      $handler = ROOT . '/engine/404error.inc';

      $categories = $TREE->getFlatTree();
      $SMARTY->assign('categories', $categories);

      if($REQUEST->getRequestLength() > 0)
      {
         $i = 0;
         while(($tmp_file = array_pop($tmp_request)) !== NULL)
         {
            if(is_file(ROOT . '/engine/admin/' . $tmp_file . '.php'))
            {
               $handler = ROOT . '/engine/admin/' . $tmp_file . '.php';
               break;
            }
         }
      } else
      {
         $handler = ROOT . '/engine/admin/index.php';
      }
   } else
   {
      $handler = ROOT . '/engine/admin/index.php';
      $layout = 'login.html';
   }
   require_once($handler);
   
} else
{
   if($SMARTY->is_cached())
   {
      $SMARTY->display();
      exit();
   }


   # WORK UNDER FRONTEND MODE IF CACHED IS FALSE
   include_once 'content.inc';
}

$SMARTY->assign('category', $category);
$SMARTY->assign('articles', $articles);
$SMARTY->assign('article', $article);
$SMARTY->assign('pages', paginator::getPages());
$SMARTY->assign('meta', $meta);


if($REQUEST->isAdminMode())
{
   @$SMARTY->register_object('FIELDS', fields::getInstance(), array('getFieldHTML','setFieldsValue','isFieldEnabled','attrSetter'), FALSE);

   if(($ErrorHandler->getErrorStatus() && !$ErrorHandler->getErrorStatus('access')) || $ErrorHandler->getSuccess())
           $layout = 'results.html';
   if($layout)
   {
      $SMARTY->display($layout);
   }
} else
{
   $SMARTY->display($layout);
}



// TODO: в галерее, для каждой записи добавить поле рейтинга (общая суммируемая оценка) и поле голосов - чтобы был рейтинг по картинкам
// TODO: переписать библиотеку работы с БД, так чтобы она базировалась на системном фильтре, ну и в стандартке PHP5
// TODO: при редактировании раздела, на табе статьи - список статей и форма по полям (подумать каким) для фильтра статей - для отбора только по определенному критерию, также тут возможность изменить позицию в списке
// TODO: добавить возможность назначения объязательных полей и проверку их при заполнении через админку, а также типа поля (число, строка)
// TODO: добавить рейтинг к статьям
// TODO: запрограммировать управление сортировками для выборки статей
// TODO: добавить поле алиаса для статьи, и если оно установлено - нужно подумать как делать и разбирать урл с алиасом статьи вместо номера
// TODO: сделать инструмент бекапа - с возможностью выбора - структуры, или всех данных с картинками, файлами или без
// TODO: при изменении алиаса раздела - в случае если у него есть приатаченый стартап - переименовывать стартап, соответственно если существует стартап с таким алиасом - предупреждать о специальном значении алиаса
// TODO: добавить в админке возможность сортировать статьи в дереве динамически, ну или хотябы добавить настройку сортировки дерева, подумать как с этим будет работать виджет UI
// TODO: сделать возможность управления лейоутом, т.е. пользователь может в графическом виде включать - выключать блоки на сайте
// TODO: переделать мастер редактирования поля, сделать JS object с набором полей, и методами сабмита, чтобы не было построения кода по ситуации
// TODO: добавить бекап дефалтовых полей - с 0 нодом
// TODO: при сохранении связанных статей - проверять установки поля - на разрешенность привязывания статей или узлов
// TODO: перенести регистрацию пользователя с Ноны в основную ветку
// TODO: добавить в текстовый редактор - маркер ссылки на статью внутри сайта, и соответственно - добавить постфильтр.
// TODO: ошибку 404 генерировать через класс обработки ошибок
// TODO: класс обработки ошибок рефакторить в статический класс
// TODO: добавить возможность административных полей - доступных для редактирования только суперпользователю
// TODO: добавить возможность избиратльно включать какие материалы с какими можно связывать (раздел - статья, статья - статья, раздел - раздел)
// TODO: не должно быть перехода на раздел который помечен как системный, или неактивный
// TODO: не работает кеш для переключения я зыков по доменам - используется страница первого закешированного языка
// TODO: рассмотреть переезд на новый шаблонизатор: http://twig.sensiolabs.org/doc/intro.html - это вместе с разработкой нормального кешера


// TODO: сортировка значений SELECT